package Seccao;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.math.*;

/**
 *
 * @author Joyce Maiara
 */
public class Calculo {

    public float areaRetang(float base, float altura) {
        float area;
        area = base * altura;
        return area;
    }

    public float areaTriang(float base, float altura) {
        float area;
        area = (base * altura) / 2;
        return area;
    }

    public float areaCirculo(float raio) {
        float area;
        area = (float) (Math.PI * Math.pow(raio, 2));
        return area;
    }

    public float areaSemiCirculo(float raio) {
        float area;
        area = (float) ((Math.PI * Math.pow(raio, 2)) / 2);
        return area;
    }

    public float areaQuartoCirculo(float raio) {
        float area;
        area = (float) ((Math.PI * Math.pow(raio, 2)) / 4);
        return area;
    }

    public float momentInerciaRetangX(float base, float altura) {
        float ix;
        ix = (float) ((base * Math.pow(altura, 3)) / 3);
        return ix;
    }

    public float momentInerciaRetangY(float base, float altura) {
        float iy;
        iy = (float) ((Math.pow(base, 3) * altura) / 3);
        return iy;
    }

    public float momentInerciaTriangX(float base, float altura) {
        float ix;
        ix = (float) ((base * Math.pow(altura, 3)) / 12);
        return ix;
    }

    public float momentInerciaTriangY(float base, float altura) {
        float iy;
        iy = (float) ((Math.pow(base, 3) * altura) / 12);
        return iy;
    }

    public float momentInerciaCirculoX_Y(float raio) {

        //return Math.PI*Math.pow(raio, 4)/4; // eixo baricentrico
        return (float) ((5 * Math.PI * Math.pow(raio, 4)) / 4);
    }

    public float momentInerciaSemiCirculoX_Y(float raio) {

        //return Math.PI*Math.pow(raio, 4)/8; eixo baricentrico
        return (float) ((5 * Math.PI * Math.pow(raio, 4)) / 8);
    }

    public float momentInerciaQuartoCirculoX_Y(float raio) {

        //return Math.PI*Math.pow(raio, 4)/16; eixo baricentrico
        return (float) (Math.PI * Math.pow(raio, 4) / 16);
    }

    public float produtoInerciaRetangulo(float base, float altura) {

        return (float) ((Math.pow(base, 2) * Math.pow(altura, 2)) / 4);
    }

    public float produtoInerciaTriangulo(float base, float altura) {

        return (float) ((Math.pow(base, 2) * Math.pow(altura, 2)) / 8);
    }

    public float produtoInerciaCirculo(float raio) {

        return (float) (Math.PI * Math.pow(raio, 4));
    }

    public float produtoInerciaSemiCirculo(float raio) {

        return (float) (Math.PI * Math.pow(raio, 4) / 4); // Dúvida quanto a este valor ou se é 0
    }

    public float produtoInerciaQuartoCirculo(float raio) {

        return (float) (Math.pow(raio, 4) / 8);
    }

    public float produtoInerciaPoligono(int[] xPontos, int[] yPontos) {
        int[] xp2, yp2;        
        xp2 = new int[xPontos.length];
        yp2 = new int[yPontos.length];
        float result = 0;
        normalizarPontos(xPontos, yPontos, xp2, yp2);
        for (int i = 0; i < xp2.length - 1; i++) {            
            result = (xp2[i]*yp2[i+1] + 2*xp2[i]*yp2[i] + 2*(xp2[i+1]*yp2[i+1]) + xp2[i+1]*yp2[i]) * (xp2[i] * yp2[i + 1] - xp2[i + 1] * yp2[i])/24 + result;
            //result= (((xp2[i]*yp2[i+1] - xp2[i+1]*yp2[i])*(xp2[i]+xp2[i+1]) )/2) + result;
        }
        return result;
    }

    public float momentInerciaPoligonoX(int[] xPontos, int[] yPontos) {
        int[] xp2, yp2;
        float area = areaPoligono(xPontos, yPontos);
        xp2 = new int[xPontos.length];
        yp2 = new int[yPontos.length];
        float result = 0;
        normalizarPontos(xPontos, yPontos, xp2, yp2);
        for (int i = 0; i < xp2.length - 1; i++) {
            result = (yp2[i + 1] * yp2[i + 1] + yp2[i] * yp2[i] + yp2[i + 1] * yp2[i])
                    * (xp2[i] * yp2[i + 1] - xp2[i + 1] * yp2[i]) / 12 + result;
            //result= (((xp2[i]*yp2[i+1] - xp2[i+1]*yp2[i])*(xp2[i]+xp2[i+1]) )/2) + result;
        }
        return result;
    }

    public float momentInerciaPoligonoY(int[] xPontos, int[] yPontos) {
        int[] xp2, yp2;
        float area = areaPoligono(xPontos, yPontos);
        xp2 = new int[xPontos.length];
        yp2 = new int[yPontos.length];
        float result = 0;
        normalizarPontos(xPontos, yPontos, xp2, yp2);
        for (int i = 0; i < xp2.length - 1; i++) {
            result = (xp2[i + 1] * xp2[i + 1] + xp2[i] * xp2[i] + xp2[i + 1] * xp2[i]) * (xp2[i] * yp2[i + 1] - xp2[i + 1] * yp2[i]) / 12 + result;
        }
        return result;
    }

    public float areaPoligono(int[] xPontos, int[] yPontos) {
        int[] xp2, yp2;
        xp2 = new int[xPontos.length];
        yp2 = new int[yPontos.length];
        float area = 0;
        normalizarPontos(xPontos, yPontos, xp2, yp2);

        for (int i = 0; i < xp2.length - 1; i++) {
            area = (xp2[i] * yp2[i + 1] - xp2[i + 1] * yp2[i]) / 2 + area;
        }
        return area;
    }

    private void normalizarPontos(int[] xp, int[] yp, int[] xp2, int[] yp2) {
        if (xp[0] != 0 || yp[0] != 0) {
            for (int i = 0; i < xp.length; i++) {
                xp2[i] = xp[i] - xp[0];
                yp2[i] = yp[i] - yp[0];
            }
        }
    }
}
